Hi iansjack, thanks for your message.
iansjack wrote:I know it's difficult to hear someone saying "this is really too difficult for you to attempt without adequate preparation", but some things in life just are.
Thanks for understanding. My initial intent behind this post was not to make it specific to my situation, but perhaps it would be helpful if I provided a bit of context as to where I am in my programming journey.
About three years ago, I took a class where I had my first introduction to the C programming language and most of its features. All of our projects were done on old desktop computers running GNU-Linux. We learned about the compilation process using the GNU development suite (the gcc toolchain, glibc, binutils), basic terminal I/O, developing small applications using the curses library, developing multithreaded applications using the pthread library, PWM control and basic (hardware) I/O using a parallel port and a system library, basic circuit design, the 555 timer, and some 7400-series chips including shift registers, seven-segment decoders, and 3 to 8 line decoders for multiplexing. This was all done within the environment of an operating system, of course.
A year after that, I took a course which built off of some of the material in the previous course, this time adding serial (RS232) communication between two computers (TX and RX swapped) using a system library, but most of the focus of this course was on microcontrollers. Using the PIC16F690, I learned a bit about microcontroller architecture including the different types of memories and how to use them, and the concept of using registers to change how the microcontroller operates and to do other stuff. I also learned how to program a microcontroller using a programmer, and wrote code both in assembly language and C to perform various tasks. The summative evaluation / culminating task was to write a basic CLI for an APATCO kit which was based around the WDC65C02 and I believe came with libraries for I/O manipulation. Unfortunately, I never got to do this project because that was when COVID-19 hit and the rest of the course had to be held online, which was very disappointing, as I was looking forward to this project.
I was incredibly captivated by both of these courses. In the second course, while I was working on a microcontroller project, someone took the microcontroller from my breadboard when I wasn't there. My teacher didn't have many of these PIC16F690 microcontrollers left to give out, but at the time, I knew that Arduinos were microcontroller-based, and my teacher had lots of Arduino Unos laying around (the version with the DIP microcontroller in the socket, so it could be removed with a tool and some effort). So, like an absolute Chad, instead of asking my teacher for a new PIC, I taught myself how to write and assemble AVR assembly language using Atmel Studio (now Microchip Studio), bought an AVRISP MKII programmer online and completed my project that way. At this time, I was also watching some of Ben Eater's videos on YouTube, mostly the videos covering his 8-bit breadboard computer, which I found extremely fascinating.
Nowadays, I write all of my microcontroller code in assembly language. I like the AVR architecture a lot more than the PIC architecture. It has a wealth of useful instructions, and a feature that allows you to write to the program memory during runtime (even though I haven't used it to this day, I thought it was cool and could be useful in some more advanced projects). I think the best part though, after having written assembly for the PIC, is having 32 (more than one) general-purpose registers and not having to waste half of your clock cycles on annoying register bank switches. For about a year, on and off, I've been working on some small microcontroller projects using the ATmega328P, like writing some data to an LCD or using a rotary encoder and a bi-directional shift register to scroll a binary sequence across a few LEDs.
Right now, I'm working on my first (relatively) big microcontroller project which is a multi-purpose time-keeping device, meant to function sort of like the clock app on your phone. It's going to feature multiple alarms, timer and stopwatch functions, and making it portable shouldn't be too difficult as long as I can find an appropriate buck-boost converter. It's going to be implemented using a 128*64 graphic LCD, a piezoelectric buzzer, and a rotary encoder for data entry and menus. I really want to have it synchronize periodically with a server on the internet, but that is unfortunately out of my reach. After this project, I want to try interfacing a PS/2 keyboard with my microcontroller and write a basic CLI that can perform various operations.
About halfway into my second course, I had this revelation that microcontrollers were essentially dumbed down versions of modern processors, and that most of the knowledge and experience that I'd gained from working with microcontrollers can be applied to modern processors. Then I started to think about programming modern processors and learning about operating systems. I found OSDev online while looking for tutorials and read a bit of the wiki, after which I became discouraged and decided that I'd come back to it at some other time. Quite recently, I picked it back up again and followed the first bit of a basic tutorial that I found online. From what I read, it covered some of the basics of the x86 architecture such as processor modes, memory models, the GPRs and a few processor instructions, a bit of NASM, the boot sector, using BIOS routines, addressing in real mode, writing a GDT, switching to protected mode, addressing in protected mode, using the video memory and text mode to display text to the screen, and that's where I stopped reading. Then I proceeded to read particular sections of the actual Intel x86 Software Developer's Manual, and that's where I am now.
Where would you recommend I go from here?
iansjack wrote:...people here genuinely don't want people to be discouraged from OS development because they attempt it when they are not ready.
I think that's great and definitely in the right spirit! I still think the wiki could be a little nicer about getting that across though. I mean, I'm noticing a significant discrepancy between what you're saying and how the wiki came across. "Failure to comply will make you look silly" sounds a bit menacing, wouldn't you agree?
- AceOfClubs